package com.atwj.dao.impl;

import com.atwj.utils.JdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/*
 * QreryRunner类(org.apache.commons.dbutils.QueryRunner) 是Dbutils的核心类之一，
 * 它显著的简化了SQL查询，并与ResultSetHandler协同工作将使编码量大为减少
 *
 * ScalarHandler:将结果集第一行的某一列放到某个对象中
 * BeanHandler：将结果集中的第一行数据封装到一个对应的JavaBean实例中。
 * BeanListHandler：将结果集中的每一行数据都封装到一个对应的JavaBean实例中，存放到List里。
 * */

/**
 * @author 吴先森
 * @create 2022-03-17 13:41
 * <p>
 * - DAO：Data Access Object访问数据信息的类和接口，包括了对数据的CRUD（Create、Retrival、Update、Delete），而不包含任何业务相关的信息。有时也称作：BaseDAO
 * - 作用：为了实现功能的模块化，更有利于代码的维护和升级。
 */

//使用Dbutils操作数据库
public abstract class baseDao {


    private QueryRunner queryRunner = new QueryRunner();


    /*
     * update() 方法执行：Insert\Update\Delete语句
     * */
    public int update(String sql, Object... args) {
        Connection conn = JdbcUtils.getConnection();
        try {
            return queryRunner.update(conn, sql, args);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }


    /**
     * 查询返回一个JavaBean对象
     *
     * @param type 返回对象类型
     * @param sql  执行sql语句
     * @param args sql对应参数
     * @return T
     * @author 吴先森
     * @date 14:47
     */

    public <T> T queryForOne(Class<T> type, String sql, Object... args) {

        Connection conn = JdbcUtils.getConnection();
        try {
            return queryRunner.query(conn, sql, new BeanHandler<T>(type), args);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 查询返回多个JavaBean的sql语句
     *
     * @param type 返回对象类型
     * @param sql  执行sql语句
     * @param args sql对应参数
     * @return List<T>
     * @author 吴先森
     * @date 14:59
     */
    public <T> List<T> queryForList(Class<T> type, String sql, Object... args) {

        Connection conn = JdbcUtils.getConnection();
        try {
            return queryRunner.query(conn, sql, new BeanListHandler<T>(type), args);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 执行返回一行一列的sql语句
     *
     * @param sql  执行sql语句
     * @param args sql对应参数
     * @return java.lang.Object
     * @author 吴先森
     * @date 15:02
     */
    public Object queryForSingleValue(String sql, Object... args) {
        Connection conn = JdbcUtils.getConnection();
        try {
            return queryRunner.query(conn, sql, new ScalarHandler(), args);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}
